//package pers.zc.activiti.controller;
//
//import org.activiti.engine.RepositoryService;
//import org.activiti.engine.RuntimeService;
//import org.activiti.engine.TaskService;
//import org.activiti.engine.repository.Deployment;
//import org.activiti.engine.repository.ProcessDefinition;
//import org.activiti.engine.runtime.ProcessInstance;
//import org.activiti.engine.task.Task;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
///**
// * @author zc 2018-06-04
// */
//@RestController
//@RequestMapping("/activiti")
//public class ActivitiController {
//	/**
//	 * 流程仓库Service ,用于管理流程仓库,例如 部署,删除,读取流程资源
//	 */
//	@Autowired
//	private RepositoryService repositoryService;
//	/**
//	 * 运行时service,可以处理所有正在运行状态的流程实例,任务等
//	 */
//	@Autowired
//	private RuntimeService runtimeService;
//	/**
//	 * 任务service,用户管理.查询任务,例如 签收 办理 指派 等
//	 */
//	@Autowired
//	private TaskService taskService;
//
//	@RequestMapping("helloWorld")
//    public void helloWorld() {
//
//        //根据bpmn文件部署流程
//        Deployment deploy = repositoryService.createDeployment()
//        									.addClasspathResource("TestProcess.bpmn") //指定对应的bpmn文件
//        									.deploy();
//        //获取流程定义
//        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult();
//		System.out.println("流程id"+deploy.getId());
//        //启动流程定义，返回流程实例
//        ProcessInstance pi = runtimeService.startProcessInstanceById(processDefinition.getId());
//        String processId = pi.getId();
//        System.out.println("流程创建成功，当前流程实例ID："+processId);
//
//        Task task=taskService.createTaskQuery().processInstanceId(processId).singleResult();
//        System.out.println("执行前，任务名称："+task.getName());
//        taskService.complete(task.getId());
//
//        task = taskService.createTaskQuery().processInstanceId(processId).singleResult();
//        System.out.println("task为null，任务执行完毕："+task);
//	}
//
//
//
//	@RequestMapping("multiAssignee")
//	public void setMultiAssignee() {
//
//		//根据bpmn文件部署流程
//		repositoryService.createDeployment().addClasspathResource("MultiAssignee.bpmn").deploy();
//		// 设置多个处理人变量 这里设置了三个人
//		Map<String, Object> variables = new HashMap<>();
//		List<String> userList = new ArrayList<>();
//		userList.add("user1");
//		userList.add("user2");
//		userList.add("user3");
//		variables.put("userList", userList);
//		//采用key来启动流程定义并设置流程变量，返回流程实例
//		ProcessInstance pi = runtimeService.startProcessInstanceByKey("multiAssigneeProcess", variables);
//		String processId = pi.getId();
//		System.out.println("流程创建成功，当前流程实例ID："+processId);
//
//		// 查看user1的任务
//		List<Task> list = taskService.createTaskQuery().taskAssignee("user1").list();
//		if(list!=null && list.size()>0){
//            for(org.activiti.engine.task.Task task:list){
//                System.out.println("任务ID："+task.getId());
//                System.out.println("任务的办理人："+task.getAssignee());
//                System.out.println("任务名称："+task.getName());
//                System.out.println("任务的创建时间："+task.getCreateTime());
//                System.out.println("流程实例ID："+task.getProcessInstanceId());
//                System.out.println("#######################################");
//            }
//        }
//
//		// 查看user2的任务
//		List<Task> list2 = taskService.createTaskQuery().taskAssignee("user2").list();
//		if(list2!=null && list2.size()>0){
//            for(org.activiti.engine.task.Task task:list2){
//                System.out.println("任务ID："+task.getId());
//                System.out.println("任务的办理人："+task.getAssignee());
//                System.out.println("任务名称："+task.getName());
//                System.out.println("任务的创建时间："+task.getCreateTime());
//                System.out.println("流程实例ID："+task.getProcessInstanceId());
//                System.out.println("#######################################");
//            }
//        }
//
//		// 查看user3的任务
//		List<Task> list3 = taskService.createTaskQuery().taskAssignee("user3").list();
//		if(list3!=null && list3.size()>0){
//            for(org.activiti.engine.task.Task task:list3){
//                System.out.println("任务ID："+task.getId());
//                System.out.println("任务的办理人："+task.getAssignee());
//                System.out.println("任务名称："+task.getName());
//                System.out.println("任务的创建时间："+task.getCreateTime());
//                System.out.println("流程实例ID："+task.getProcessInstanceId());
//                System.out.println("#######################################");
//            }
//        }
//
//	}
//
//	@RequestMapping("exclusiveGateway")
//	public void exclusiveGateway() {
//
//		//根据bpmn文件部署流程
//		repositoryService.createDeployment().addClasspathResource("exclusiveGateway.bpmn").deploy();
//
//
//		// 设置User Task1受理人变量
//		Map<String, Object> variables = new HashMap<>();
//		variables.put("user1", "007");
//		//采用key来启动流程定义并设置流程变量，返回流程实例
//		ProcessInstance pi = runtimeService.startProcessInstanceByKey("exclusiveGatewayAndTimerBoundaryEventProcess", variables);
//		String processId = pi.getId();
//		System.out.println("流程创建成功，当前流程实例ID："+processId);
//
//		// 注意 这里需要拿007来查询，key-value需要拿value来获取任务
//		List<Task> list = taskService.createTaskQuery().taskAssignee("007").list();
//		Map<String, Object> variables1 = new HashMap<>();
//		variables1.put("user2", "lili"); // 设置User Task2的受理人变量
//		variables1.put("operate", ""); // 设置用户的操作 为空 表示走flow3的默认路线
//		taskService.complete(list.get(0).getId(), variables1);
//		System.out.println("User Task1被完成了，此时流程已流转到User Task2");
//
//		List<Task> list1 = taskService.createTaskQuery().taskAssignee("lili").list();
//		Map<String, Object> variables2 = new HashMap<>();
//		variables2.put("user4", "bobo");
//		variables2.put("startTime", "2018-6-11T14:22:00"); // 设置定时边界任务的触发时间 注意：后面的时间必须是ISO 8601时间格式的字符串！！！
//		taskService.complete(list1.get(0).getId(), variables2);
//
//		List<Task> list2 = taskService.createTaskQuery().taskAssignee("bobo").list();
//		if(list2!=null && list2.size()>0){
//            for(org.activiti.engine.task.Task task:list2){
//                System.out.println("任务ID："+task.getId());
//                System.out.println("任务的办理人："+task.getAssignee());
//                System.out.println("任务名称："+task.getName());
//                System.out.println("任务的创建时间："+task.getCreateTime());
//                System.out.println("流程实例ID："+task.getProcessInstanceId());
//                System.out.println("#######################################");
//            }
//        }
//	}
//
//	/**
//	 * 测试  bpmn 图id 为 test
//	 * 发起流程
//	 * 由userId1  处理
//	 * 然后由  userId2 处理
//	 * 结束
//	 */
//	@RequestMapping("test")
//	public void test(){
//		//根据bpmn文件部署流程
//		Deployment deploy = repositoryService.createDeployment().addClasspathResource("test.bpmn").name("testName").deploy();
//		System.out.println("流程id"+deploy.getId());
//		// 设置受理人变量 userId1 变量放入map中
//		Map<String, Object> variables = new HashMap<>();
//		variables.put("用户1", "007");
//		//获取流程实例
//		ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult();
//
//		//采用key来启动流程定义并设置流程变量，返回流程实例
//		ProcessInstance test =  runtimeService.startProcessInstanceByKey(processDefinition.getKey(),variables);//test: bpmn文件的id   variables : 设置的受理人变量
//		//获取实例id
//		String processId = test.getId();
//		System.out.println("流程创建成功，当前流程实例ID："+processId);
//
////		runtimeService.suspendProcessInstanceById(processId); //根据实例id挂起实例
//		// 注意 这里需要拿userId1来查询，key-value需要拿value来获取任务
//		List<Task> userId1TaskList = taskService.createTaskQuery().taskAssignee("007").list();
//		System.out.println("---------------------------------");
//		System.out.println(userId1TaskList);
//		System.out.println("---------------------------------");
//		//设置第二个受理人变量
//		Map<String, Object> variables1 = new HashMap<>();
//		variables1.put("用户2", "008");
//		//userId1 的流程完成, 开始让第二个人受理
//		taskService.complete(userId1TaskList.get(0).getId(),variables1);
//		System.out.println("此时流程转到userId2");
//		//开始第二个流程
//		List<Task> userId2TaskList = taskService.createTaskQuery().taskAssignee("008").list();
//		System.out.println("---------------------------------");
//		System.out.println(userId2TaskList);//输出结果
//		System.out.println("---------------------------------");
//
//		userId2TaskList.forEach(task->{
//			System.out.println("任务ID："+task.getId());
//			System.out.println("任务的办理人："+task.getAssignee());
//			System.out.println("任务名称："+task.getName());
//			System.out.println("任务的创建时间："+task.getCreateTime());
//			System.out.println("流程实例ID："+task.getProcessInstanceId());
//			System.out.println("#######################################");
//		});
//
//
//	}
//
//
//
//
//	@RequestMapping("singleAssignee")
//	public void setSingleAssignee() {
//
//		//根据bpmn文件部署流程
//		repositoryService.createDeployment().addClasspathResource("singleAssignee.bpmn").deploy();
//		// 设置User Task1受理人变量
//		Map<String, Object> variables = new HashMap<>();
//		variables.put("user1", "007");
//		//采用key来启动流程定义并设置流程变量，返回流程实例
//		ProcessInstance pi = runtimeService.startProcessInstanceByKey("singleAssignee", variables);
//		String processId = pi.getId();
//		System.out.println("流程创建成功，当前流程实例ID："+processId);
//
//		// 注意 这里需要拿007来查询，key-value需要拿value来获取任务
//		List<Task> list = taskService.createTaskQuery().taskAssignee("007").list();
//		if(list!=null && list.size()>0){
//			for(org.activiti.engine.task.Task task:list){
//				System.out.println("任务ID："+task.getId());
//				System.out.println("任务的办理人："+task.getAssignee());
//				System.out.println("任务名称："+task.getName());
//				System.out.println("任务的创建时间："+task.getCreateTime());
//				System.out.println("流程实例ID："+task.getProcessInstanceId());
//				System.out.println("#######################################");
//			}
//		}
//
//		// 设置User Task2的受理人变量
//		Map<String, Object> variables1 = new HashMap<>();
//		variables1.put("user2", "Kevin");
//		// 因为007只有一个代办的任务，直接完成任务，并赋值下一个节点的受理人user2为Kevin办理
//		taskService.complete(list.get(0).getId(), variables1);
//		System.out.println("User Task1被完成了，此时流程已流转到User Task2");
//	}
//}
